public class ReverseStringII {
    /*
    * 反转字符串II
    * 给定一个字符串 s 和一个整数 k，从字符串开头算起，每计数至 2k 个字符，就反转这 2k 字符中的前 k 个字符。
    * 如果剩余字符少于 k 个，则将剩余字符全部反转。
    * 如果剩余字符小于 2k 但大于或等于 k 个，则反转前 k 个字符，其余字符保持原样。
    *
    * 1 <= s.length <= 10(4)
    * s 仅由小写英文组成
    * 1 <= k <= 10(4)
    * */
    public static void main(String[] args){
        ReverseStringII reverseStringII = new ReverseStringII();
        reverseStringII.mySolution("abcdefg", 2);
    }

    // 我的想法：计算，然后反转
    public String mySolution(String s, int k){
        char[] chars = s.toCharArray();
        int round = s.length() / (2 * k);
        int rest = s.length() % (2 * k);
        // 处理需要反转的
        for (int i = 0; i < round; i++) {
            reverse(chars, i*2*k, k);
        }
        // 处理剩余的
        reverse(chars, round*2*k, rest >= k? k : rest);
        return new String(chars);
    }

    public void reverse(char[] s, int start, int len){
        if(len == 0)
            return;
        int l = start;
        int r = l + len -1;
        while (l < r){
            s[l] ^= s[r];
            s[r] ^= s[l];
            s[l] ^= s[r];
            l++;
            r--;
        }
    }
}
